﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Persistencia_y_capa_de_negocio;
using System.Collections;

namespace clonegame
{
    public partial class formularioMaestro : Form
    {
        private static readonly formularioMaestro instancia = new formularioMaestro();

        public static formularioMaestro Instancia
        {
            get { return instancia; }
        }

        public enum est { inicio, administrar, juego, recursos, unidades, edificios, usuarios, noticias, reportes };

        private int estActual;
        public int EstActual
        {
            get { return estActual; }
            set { estActual = value; }
        }

        private ENAdmin usuarioLogueado;
        public ENAdmin UsuarioLogueado
        {
            get { return usuarioLogueado; }
            set { usuarioLogueado = value; ActualizaMenu(); }
        }

        public void MuestraForm(UserControl u)
        {
            panelContenedor.Controls.Clear();
            panelContenedor.Controls.Add(u);
            u.Dock = DockStyle.Fill;
        }

        public formularioMaestro()
        {
            InitializeComponent();
            // Por defecto mostramos la pantalla de bienvenida.
            formularioBienvenida form = formularioBienvenida.Instancia;
            estActual = (int)est.inicio;
            pbInicio.Image = clonegame.Properties.Resources.InicioSi;
            MuestraForm(form);
        }

        /// <summary>
        /// Actualiza los elementos del menú que son visibles en función del nivel del usuario.
        /// </summary>
        public void ActualizaMenu()
        {
            formularioBienvenida.Instancia.actualizaResumen();
            switch(UsuarioLogueado.Nivel)
            {
                case 0:
                {
                    // Sudo. Puede verlo todo.
                    pbInicio.Visible = true;
                    pbAdministrar.Visible = true;
                    pbJuego.Visible = true;
                    pbRecursos.Visible = true;
                    pbUnidades.Visible = true;
                    pbEdificios.Visible = true;
                    pbUsuarios.Visible = true;
                    pbNoticias.Visible = true;
                    pbReportes.Visible = true;

                    tsmVerInicio.Visible = true;
                    tsmVerAdministrar.Visible = true;
                    tsmVerJuego.Visible = true;
                    tsmVerRecursos.Visible = true;
                    tsmVerUnidades.Visible = true;
                    tsmVerEdificios.Visible = true;
                    tsmVerUsuarios.Visible = true;
                    tsmVerNoticias.Visible = true;
                    tsmBuscarRecursos.Visible = true;
                    tsmBuscarUnidades.Visible = true;
                    tsmBuscarEdificios.Visible = true;
                    tsmBuscarUsuarios.Visible = true;
                    tsmBuscarNoticias.Visible = true;
                    tsmBuscarReportes.Visible = true;
                    break;
                }
                case 1:
                {
                    // Moderador. Puede verlo todo.
                    pbInicio.Visible = true;
                    pbAdministrar.Visible = true;
                    pbJuego.Visible = true;
                    pbRecursos.Visible = true;
                    pbUnidades.Visible = true;
                    pbEdificios.Visible = true;
                    pbUsuarios.Visible = true;
                    pbNoticias.Visible = true;
                    pbReportes.Visible = true;

                    tsmVerInicio.Visible = true;
                    tsmVerAdministrar.Visible = true;
                    tsmVerJuego.Visible = true;
                    tsmVerRecursos.Visible = true;
                    tsmVerUnidades.Visible = true;
                    tsmVerEdificios.Visible = true;
                    tsmVerUsuarios.Visible = true;
                    tsmVerNoticias.Visible = true;
                    tsmBuscarRecursos.Visible = true;
                    tsmBuscarUnidades.Visible = true;
                    tsmBuscarEdificios.Visible = true;
                    tsmBuscarUsuarios.Visible = true;
                    tsmBuscarNoticias.Visible = true;
                    tsmBuscarReportes.Visible = true;
                    break;
                }
                case 2:
                {
                    // Moderador. Puede ver recursos, unidades y edificios.
                    pbInicio.Visible = true;
                    pbAdministrar.Visible = false;
                    pbJuego.Visible = false;
                    pbRecursos.Visible = true;
                    pbUnidades.Visible = true;
                    pbEdificios.Visible = true;
                    pbUsuarios.Visible = false;
                    pbNoticias.Visible = false;
                    pbReportes.Visible = false;

                    tsmVerInicio.Visible = true;
                    tsmVerAdministrar.Visible = false;
                    tsmVerJuego.Visible = false;
                    tsmVerRecursos.Visible = true;
                    tsmVerUnidades.Visible = true;
                    tsmVerEdificios.Visible = true;
                    tsmVerUsuarios.Visible = false;
                    tsmVerNoticias.Visible = false;
                    tsmBuscarRecursos.Visible = true;
                    tsmBuscarUnidades.Visible = true;
                    tsmBuscarEdificios.Visible = true;
                    tsmBuscarUsuarios.Visible = false;
                    tsmBuscarNoticias.Visible = false;
                    tsmBuscarReportes.Visible = false;
                    break;
                }
                case 3:
                {
                    // Editor. Puede ver noticias.
                    pbInicio.Visible = true;
                    pbAdministrar.Visible = false;
                    pbJuego.Visible = false;
                    pbRecursos.Visible = false;
                    pbUnidades.Visible = false;
                    pbEdificios.Visible = false;
                    pbUsuarios.Visible = false;
                    pbNoticias.Visible = true;
                    pbReportes.Visible = false;

                    tsmVerInicio.Visible = true;
                    tsmVerAdministrar.Visible = false;
                    tsmVerJuego.Visible = false;
                    tsmVerRecursos.Visible = false;
                    tsmVerUnidades.Visible = false;
                    tsmVerEdificios.Visible = false;
                    tsmVerUsuarios.Visible = false;
                    tsmVerNoticias.Visible = true;
                    tsmBuscarRecursos.Visible = false;
                    tsmBuscarUnidades.Visible = false;
                    tsmBuscarEdificios.Visible = false;
                    tsmBuscarUsuarios.Visible = false;
                    tsmBuscarNoticias.Visible = true;
                    tsmBuscarReportes.Visible = false;
                    break;
                }
            }
        }

        /// <summary>
        ///     Cambia el dibujo de la pestaña anterior seleccionada por el de no
        ///     seleccionada para que luego seleccionemos la actual.
        /// </summary>
        public void ActualizaImg()
        {
            switch (estActual)
            {
                case (int)est.inicio:
                    {
                        pbInicio.Image = clonegame.Properties.Resources.InicioNo;
                        break;
                    }

               case (int)est.administrar:
                    {
                        pbAdministrar.Image = clonegame.Properties.Resources.AdminNo1;
                        break;
                    }

                case (int)est.juego:
                    {
                        pbJuego.Image = clonegame.Properties.Resources.JuegoNo;
                        break;
                    }

                case (int)est.recursos:
                    {
                        pbRecursos.Image = clonegame.Properties.Resources.RecursosNo;
                        break;
                    }

                case (int)est.unidades:
                    {
                        pbUnidades.Image = clonegame.Properties.Resources.UnidadesNo;
                        break;
                    }

                case (int)est.edificios:
                    {
                        pbEdificios.Image = clonegame.Properties.Resources.EdificiosNo;
                        break;
                    }

                case (int)est.usuarios:
                    {
                        pbUsuarios.Image = clonegame.Properties.Resources.UsuariosNoi;
                        break;
                    }

                case (int)est.noticias:
                    {
                        pbNoticias.Image = clonegame.Properties.Resources.NoticiasNo;
                        break;
                    }

                case (int)est.reportes:
                    {
                        // Cambiar
                        pbReportes.Image = clonegame.Properties.Resources.ReportesNo;
                        break;
                    }
            }
        }

        private void formularioMaestro_Load(object sender, EventArgs e)
        {
        }

        private void formularioMaestro_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (MessageBox.Show("¿Desea Salir?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
            {
                e.Cancel = true;
            }
            else
            {
                // Registramos la acción.
                ENActividad act = new ENActividad();
                act.Accion = "Logout";
                act.Responsable = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
                act.Descripcion = "Ha abandonado a la aplicación.";
                act.Fecha = DateTime.Now.ToString();
                CADActividad.Instancia.InsertarActividad(act);
            }
        }

        /////////////////////////////////////
        // Funciones del menú de pestañas. //
        /////////////////////////////////////

        // Sobre inicio.
        private void pbInicio_Hover(object sender, EventArgs e)
        {
            if (estActual != (int)est.inicio)
            {
                pbInicio.Image = clonegame.Properties.Resources.inicioOn;
            }
        }

        // Fuera inicio.
        private void pbInicio_Leave(object sender, EventArgs e)
        {
            if (estActual != (int)est.inicio)
            {
                pbInicio.Image = clonegame.Properties.Resources.InicioNo;
            }
        }
        
        // Sobre administrar.
        private void pbAdministrar_Enter(object sender, EventArgs e)
        {
            if (estActual != (int)est.administrar)
            {
                pbAdministrar.Image = clonegame.Properties.Resources.AdminOn1;
            }
        }

        // Fuera administrar.
        private void pbAdministrar_Leave(object sender, EventArgs e)
        {
            if (estActual != (int)est.administrar)
            {
                pbAdministrar.Image = clonegame.Properties.Resources.AdminNo1;
            }
        }

        // Sobre juego.
        private void pbJuego_Enter(object sender, EventArgs e)
        {
            if (estActual != (int)est.juego)
            {
                pbJuego.Image = clonegame.Properties.Resources.juegoOn;
            }
        }

        // Fuera juego.
        private void pbJuego_Leave(object sender, EventArgs e)
        {
            if (estActual != (int)est.juego)
            {
                pbJuego.Image = clonegame.Properties.Resources.JuegoNo;
            }
        }

        // Sobre recursos.
        private void pbRecursos_Enter(object sender, EventArgs e)
        {
            if (estActual != (int)est.recursos)
            {
                pbRecursos.Image = clonegame.Properties.Resources.RecursosOn;
            }
        }

        // Fuera recursos.
        private void pbRecursos_Leave(object sender, EventArgs e)
        {
            if (estActual != (int)est.recursos)
            {
                pbRecursos.Image = clonegame.Properties.Resources.RecursosNo;
            }
        }

        // Sobre unidades.
        private void pbUnidades_Enter(object sender, EventArgs e)
        {
            if (estActual != (int)est.unidades)
            {
                pbUnidades.Image = clonegame.Properties.Resources.unidadesOn;
            }
        }

        // Fuera unidades.
        private void pbUnidades_Leave(object sender, EventArgs e)
        {
            if (estActual != (int)est.unidades)
            {
                pbUnidades.Image = clonegame.Properties.Resources.UnidadesNo;
            }
        }

        // Sobre edificios.
        private void pbEdificios_Enter(object sender, EventArgs e)
        {
            if (estActual != (int)est.edificios)
            {
                pbEdificios.Image = clonegame.Properties.Resources.edificiosOn;
            }
        }

        // Fuera edificios.
        private void pbEdificios_Leave(object sender, EventArgs e)
        {
            if (estActual != (int)est.edificios)
            {
                pbEdificios.Image = clonegame.Properties.Resources.EdificiosNo;
            }
        }

        // Sobre usuarios.
        private void pbUsuarios_Enter(object sender, EventArgs e)
        {
            if (estActual != (int)est.usuarios)
            {
                pbUsuarios.Image = clonegame.Properties.Resources.usuariosOn;
            }
        }

        // Fuera usuarios.
        private void pbusuarios_Leave(object sender, EventArgs e)
        {
            if (estActual != (int)est.usuarios)
            {
                pbUsuarios.Image = clonegame.Properties.Resources.UsuariosNoi;
            }
        }

        // Sobre noticias.
        private void pbNoticias_Enter(object sender, EventArgs e)
        {
            if (estActual != (int)est.noticias)
            {
                pbNoticias.Image = clonegame.Properties.Resources.noticiasOn;
            }
        }

        // Fuera noticias.
        private void pbNoticias_Leave(object sender, EventArgs e)
        {
            if (estActual != (int)est.noticias)
            {
                pbNoticias.Image = clonegame.Properties.Resources.NoticiasNo;
            }
        }

        // Sobre reportes.
        private void pbReportes_Enter(object sender, EventArgs e)
        {
            if (estActual != (int)est.reportes)
            {
                // Cambiar
                pbReportes.Image = clonegame.Properties.Resources.ReportesOn;
            }
        }

        // Fuera reportes.
        private void pbReportes_Leave(object sender, EventArgs e)
        {
            if (estActual != (int)est.reportes)
            {
                // Cambiar
                pbReportes.Image = clonegame.Properties.Resources.ReportesNo;
            }
        }

        ////////////////////
        // BOTÓN DE AYUDA //
        ////////////////////
        private void pbAyuda_Click(object sender, EventArgs e)
        {
            pbAyuda.Image = clonegame.Properties.Resources.ayudapulsado;
            mostrarAyuda(this,null);
        }

        private void pbAyuda_Enter(object sender, EventArgs e)
        {
            pbAyuda.Image = clonegame.Properties.Resources.ayudasobre;
        }

        private void pbAyuda_Leave(object sender, EventArgs e)
        {
            pbAyuda.Image = clonegame.Properties.Resources.ayudanormal;
        }

        private void pbAyuda_Down(object sender, MouseEventArgs e)
        {
            pbAyuda.Image = clonegame.Properties.Resources.ayudapulsado;
        }

        private void pbAyuda_Up(object sender, MouseEventArgs e)
        {
            pbAyuda.Image = clonegame.Properties.Resources.ayudanormal;
        }

        private void acercaDeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            formularioAcercaDe.Instancia.ShowDialog();
        }

        private void mostrarAyuda(object sender, EventArgs e)
        {
            formularioAyuda form = formularioAyuda.Instancia;
            form.ShowDialog();
        }

        /// <summary>
        /// Función que enseña el formulario adecuado en cada momento
        /// sin tener que usar una función por botón.
        /// </summary>
        /// <param name="seccion">String con la sección a la que queremos saltar.</param>
        /// <param name="busqueda">Indica si se debe abrir el panel de busqueda (true) o el de ver(false).</param>
        public void CambiarSeccion(string seccion, bool busqueda)
        {
            bool continua = true;

            if (estActual == (int)est.recursos)
            {
                if (formularioRecursos.Instancia.Estado == "editando")
                {
                    if (MessageBox.Show("Si cambia de formulario, perderá la información que no ha guardado", "Información", MessageBoxButtons.OKCancel) == DialogResult.OK)
                    {
                        continua = true;
                        formularioRecursos.Instancia.Estado = "editar";
                    }
                    else
                    {
                        continua = false;
                    }
                }
                else
                {
                    continua = true;
                    formularioRecursos.Instancia.Estado = "editar";
                }
            }
            else if (estActual == (int)est.unidades)
            {
                if (formularioUnidades.Instancia.Estado == "editando")
                {
                    if (MessageBox.Show("Si cambia de formulario, perderá la información que no ha guardado", "Información", MessageBoxButtons.OKCancel) == DialogResult.OK)
                    {
                        continua = true;
                        formularioUnidades.Instancia.Estado = "editar";
                    }
                    else
                    {
                        continua = false;
                    }
                }
                else
                {
                    continua = true;
                    formularioUnidades.Instancia.Estado = "editar";
                }
            }
            else if (estActual == (int)est.edificios)
            {
                if (formularioEdificios.Instancia.Estado == "editando")
                {
                    if (MessageBox.Show("Si cambia de formulario, perderá la información que no ha guardado", "Información", MessageBoxButtons.OKCancel) == DialogResult.OK)
                    {
                        continua = true;
                        formularioEdificios.Instancia.Estado = "editar";
                    }
                    else
                    {
                        continua = false;
                    }
                }
                else
                {
                    continua = true;
                    formularioEdificios.Instancia.Estado = "editar";
                }
            }
            else if (estActual == (int)est.juego)
            {
                if (formularioJuego.Instancia.Estado == "editando")
                {
                    if (MessageBox.Show("Si cambia de formulario, perderá la información que no ha guardado", "Información", MessageBoxButtons.OKCancel) == DialogResult.OK)
                    {
                        continua = true;
                        formularioJuego.Instancia.Estado = "editar";
                    }
                    else
                    {
                        continua = false;
                    }
                }
                else
                {
                    continua = true;
                    formularioJuego.Instancia.Estado = "editar";
                }
            }

            // Si no hay datos sin guardar, continuamos.
            if (continua)
            {
                switch (seccion)
                {
                    case "bienvenida":
                        {
                            if (estActual != (int)est.inicio)
                            {
                                ActualizaImg();
                                pbInicio.Image = clonegame.Properties.Resources.InicioSi;
                                estActual = (int)est.inicio;
                            }
                            MuestraForm(formularioBienvenida.Instancia);
                            formularioBienvenida.Instancia.Focus();

                            break;
                        }
                    case "actividad":
                        {
                            if (estActual != (int)est.inicio)
                            {
                                ActualizaImg();
                                pbInicio.Image = clonegame.Properties.Resources.InicioSi;
                                estActual = (int)est.inicio;
                            }
                            MuestraForm(formularioActividad.Instancia);
                            formularioActividad.Instancia.Focus();
                            break;
                        }
                    case "administrar":
                        {
                            if (estActual != (int)est.administrar)
                            {
                                ActualizaImg();
                                pbAdministrar.Image = clonegame.Properties.Resources.AdminSi1;
                                estActual = (int)est.administrar;
                                MuestraForm(formularioAdministrar.Instancia);
                                formularioAdministrar.Instancia.Focus();
                            }
                            break;
                        }
                    case "juego":
                        {
                            if (estActual != (int)est.juego)
                            {
                                ActualizaImg();
                                pbJuego.Image = clonegame.Properties.Resources.JuegoSi;
                                estActual = (int)est.juego;
                                MuestraForm(formularioJuego.Instancia);
                                formularioJuego.Instancia.Focus();
                            }
                            break;
                        }
                    case "recursos":
                        {
                            if (busqueda)
                                formularioRecursos.Instancia.MuestraForm(formularioRecursoBuscar.Instancia);
                            else
                                formularioRecursos.Instancia.MuestraForm(formularioRecursoEditar.Instancia);

                            if (estActual != (int)est.recursos)
                            {
                                ActualizaImg();
                                pbRecursos.Image = clonegame.Properties.Resources.RecursosSi;
                                estActual = (int)est.recursos;
                                MuestraForm(formularioRecursos.Instancia);
                                formularioRecursos.Instancia.Focus();
                            }
                            break;
                        }
                    case "unidades":
                        {
                            if (busqueda)
                                formularioUnidades.Instancia.MuestraForm(formularioUnidadBuscar.Instancia);
                            else
                                formularioUnidades.Instancia.MuestraForm(formularioUnidadEditar.Instancia);

                            if (estActual != (int)est.unidades)
                            {
                                ActualizaImg();
                                pbUnidades.Image = clonegame.Properties.Resources.UnidadesSi;
                                estActual = (int)est.unidades;
                                MuestraForm(formularioUnidades.Instancia);
                                formularioUnidades.Instancia.Focus();
                            }
                            break;
                        }
                    case "edificios":
                        {
                            if (busqueda)
                                formularioEdificios.Instancia.MuestraForm(formularioEdificioBuscar.Instancia);
                            else
                                formularioEdificios.Instancia.MuestraForm(formularioEdificioEditar.Instancia);

                            if (estActual != (int)est.edificios)
                            {
                                ActualizaImg();
                                pbEdificios.Image = clonegame.Properties.Resources.EdificiosSi;
                                estActual = (int)est.edificios;
                                MuestraForm(formularioEdificios.Instancia);
                                formularioEdificios.Instancia.Focus();
                            }
                            break;
                        }
                    case "usuarios":
                        {
                            /*if (busqueda)
                                formularioUsuarios.Instancia.MuestraForm(formularioUsuarioBuscar.Instancia);
                            else
                                formularioUsuarios.Instancia.MuestraForm(formularioUsuarioEditar.Instancia);
                            */
                            if (estActual != (int)est.usuarios)
                            {
                                ActualizaImg();
                                pbUsuarios.Image = clonegame.Properties.Resources.UsuariosSi;
                                estActual = (int)est.usuarios;
                                MuestraForm(formularioUsuarios.Instancia);
                                formularioUsuarios.Instancia.Focus();
                            }
                            break;
                        }
                    case "noticias":
                        {
                            /*if (busqueda)
                                formularioNoticias.Instancia.MuestraForm(formularioNoticiasBuscar.Instancia);
                            else
                                formularioNoticias.Instancia.MuestraForm(formularioNoticiasEditar.Instancia);
                            */
                            if (estActual != (int)est.noticias)
                            {
                                ActualizaImg();
                                pbNoticias.Image = clonegame.Properties.Resources.NoticiasSi;
                                estActual = (int)est.noticias;
                                MuestraForm(formularioNoticias.Instancia);
                                formularioNoticias.Instancia.Focus();
                            }
                            break;
                        }

                    case "reportes":
                        {
                            /*if (busqueda)
                                formularioReportes.Instancia.MuestraForm(formularioReportesBuscar.Instancia);
                            else
                                formularioReportes.Instancia.MuestraForm(formularioReportesEditar.Instancia);
                            */
                            if (estActual != (int)est.reportes)
                            {
                                ActualizaImg();
                                pbReportes.Image = clonegame.Properties.Resources.ReportesSi;
                                estActual = (int)est.reportes;
                                MuestraForm(formularioReportes.Instancia);
                                formularioReportes.Instancia.Focus();
                            }
                            break;
                        }
                }
            }
            
        }

        private void menuClick(object sender, EventArgs e)
        {
            CambiarSeccion(((PictureBox)sender).Tag.ToString(),false);
        }

        ///////////////////////////////
        /// Teclas de acceso rápido ///
        ///////////////////////////////
        private void formularioMaestro_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Alt && e.KeyCode.ToString() == "I")
            {
                // Inicio
                CambiarSeccion("bienvenida",false);
            }
            else if (e.Alt && e.KeyCode.ToString() == "A")
            {
                // Administrar
                CambiarSeccion("administrar", false);
            }
            else if (e.Alt && e.KeyCode.ToString() == "J")
            {
                // Juego
                CambiarSeccion("juego", false);
            }
            else if (e.Alt && e.KeyCode.ToString() == "R")
            {
                // Recursos
                CambiarSeccion("recursos", false);
            }
            else if (e.Alt && e.KeyCode.ToString() == "U")
            {
                // Unidades
                CambiarSeccion("unidades", false);
            }
            else if (e.Alt && e.KeyCode.ToString() == "E")
            {
                // Edificios
                CambiarSeccion("edificios", false);
            }
            else if (e.Alt && e.KeyCode.ToString() == "S")
            {
                // Usuarios
                CambiarSeccion("usuarios", false);
            }
            else if (e.Alt && e.KeyCode.ToString() == "N")
            {
                // Noticias
                CambiarSeccion("noticias", false);
            }

            else if (e.Alt && e.KeyCode.ToString() == "P")
            {
                // Reportes
                CambiarSeccion("reportes", false);
            }
        }


        //////////////////////////////////
        // Funciones del menú superior. //
        //////////////////////////////////
        private void tsmSalir_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void tsmClick(object sender, EventArgs e)
        {
            CambiarSeccion(((ToolStripMenuItem)sender).Tag.ToString(), false);
        }

        private void tsmBuscarClick(object sender, EventArgs e)
        {
            CambiarSeccion(((ToolStripMenuItem)sender).Tag.ToString(), true);
        }
    }
}
